﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.IO;
using Database.Forms;
using Diagrams;
using DiagramParser;
using SimulationKernel;

namespace DiagramTest
{
    public partial class Form1 : Form
    {
        Random rnd = new Random(DateTime.Now.Second);
        //соответствующие диаграм-боксам ядра симуляции
        List<SimKernel> simKernels = new List<SimKernel>();
        //ошибки парсинга
        List<DiagramError> errors;

        static int SPLIT_MARGIN = 106;
        static string APPLICATION_TITLE = "Симулятор САПР 1.0";
        /// <summary>
        /// Возвращает активный диаграм-бокс
        /// </summary>
        /// <returns></returns>
        public DiagramBox ActiveDiagramBox()
        {
            //находим активную вкладку
            if (tabDiagram.TabCount > 0)
            {
                int id = tabDiagram.SelectedIndex;
                //Находим диаграм-бокс, лежащий в панели на активной вкладке
                Panel p = (Panel)tabDiagram.TabPages[id].Controls.Find("diagramPanel", false)[0];
                return (DiagramBox)p.Controls.Find("diagramBox", false)[0];
            }
            else
                return null;
        }
        public SimKernel ActiveSimulationKernel()
        {
            DiagramBox diabox = ActiveDiagramBox();
            if (diabox!= null)
                //поиск ядра по совпадению имен
                foreach (SimKernel kernel in simKernels)
                    if (diabox.Diagram.Name == kernel.Name)
                        return kernel;
            return null;
        }
        public string RandomName8()
        {
            string name = "";
            for(int i = 0; i < 8; i++)
                name += (char)(rnd.Next(24) + (int)'A');
            return name;
        }
        public void BindKernel(ref DiagramBox diabox, ref SimKernel kernel)
        {
            kernel.Name = diabox.Diagram.Name;
            //добавление и удаление блоков с GUI в логику
            diabox.AddBlockLogic = kernel.CreateBlock;
            diabox.RemoveBlockLogic = kernel.RemoveBlock;
            //соединение блоков линиями
            diabox.ConnectBlocks = kernel.ConnectBlocks;
            diabox.DisconnectBlocks = kernel.DisconnectBlocks;
            //свойства и изменение текста (с GUI / c формы свойств)
            diabox.SetBlockProperties = kernel.SetProperties;
            diabox.ChangeText = kernel.ChangeText;
            kernel.UpdateDiagramText = diabox.UpdateText;
        }
        /// <summary>
        /// Создает новый диаграм-бокс и добавляет его на вкладку. Возвращает индекс созданной вкладки
        /// </summary>
        /// 
        public int AddNewDiagramBox(bool add_new_kernel = true)
        {
            DiagramBox diabox = new DiagramBox();
            diabox.Dock = DockStyle.Fill;
            diabox.Diagram = new Diagram();
            diabox.Diagram.Name = RandomName8();
            diabox.Name = "diagramBox";
            //пересчет границ
            diabox.RecalcDiagramBorders();
            diabox.DiagramChanged += new EventHandler(diabox_DiagramChanged);
            
            if(add_new_kernel)
            {
                //добавляем новое ядро симуляции и связываем делегаты
                SimKernel kernel = new SimKernel();
                BindKernel(ref diabox, ref kernel);
                simKernels.Add(kernel);
            }

            Panel panel = new Panel();
            panel.BorderStyle = BorderStyle.Fixed3D;
            panel.Dock = DockStyle.Fill;
            panel.Controls.Add(diabox);
            panel.Name = "diagramPanel";

            //добавляем новую вкладку
            int new_last = tabDiagram.TabPages.Count;
            tabDiagram.TabPages.Add(String.Format("Новая диаграмма {0}", new_last + 1));
            tabDiagram.TabPages[new_last].Controls.Add(panel);
            //делаем ее активной
            tabDiagram.SelectedIndex = new_last;
            //обновляем кнопки
            UpdateTitleAndButtons(false, false);
            
            return new_last;
        }
        /// <summary>
        /// Проверка текста формы и активных кнопок в зависимости от состояния диаграммы
        /// </summary>
        /// <param name="update_title">Если false, то обновляется состояние только кнопок</param>
        /// <param name="add_asterisk">Если true, в начале текстов добавляется *</param>
        void UpdateTitleAndButtons(bool update_title, bool add_asterisk)
        {
            DiagramBox diabox = ActiveDiagramBox();
            try
            {
                //обновление имени диаграммы
                if (diabox.FileName != "")
                {
                    string name = Path.GetFileName(diabox.FileName);
                    //установка соответствующего текста в заголовке формы
                    this.Text = name + " - " + APPLICATION_TITLE;
                    //То же для вкладки
                    tabDiagram.SelectedTab.Text = name;
                }
                //добавление звездочки к имени диаграммы и вкладки
                if (add_asterisk)
                {
                    if (this.Text[0] != '*')
                    {
                        this.Text = "*" + this.Text;
                        tabDiagram.SelectedTab.Text = "*" + tabDiagram.SelectedTab.Text;
                        btnSave.Enabled = true;
                    }
                }
            }
            catch (Exception ex)
            {
                this.Text = APPLICATION_TITLE;
                diabox = new DiagramBox();
                diabox.Diagram = new Diagram();
            }
            //проверка, можно ли Undo и Redo
            отменитьДействиеToolStripMenuItem.Enabled = btnUndo.Enabled = diabox.CanUndo();
            if (add_asterisk)
            {
                вернутьДействиеToolStripMenuItem.Enabled =
                    btnRedo.Enabled = diabox.CanRedo();
            }
            else
            {
                вернутьДействиеToolStripMenuItem.Enabled =
                    btnRedo.Enabled = false;//новая диаграмма не может быть Redo
            }
            //*** Проверка кнопок и меню группы "Формат" ***
            foreach (ToolStripItem t in toolStrip1.Items)
                if (t.Name.Contains("ward"))
                    t.Enabled = (diabox.Diagram.figures.Count > 0 ? true : false);
                else if (t.Name.Contains("Align"))
                    t.Enabled = (diabox.SelectedFiguresCount > 1 ? true : false);
            //меню "Порядок"
            foreach(ToolStripItem t in ((menuStrip1.Items[3]
                as ToolStripMenuItem).DropDownItems[2]
                as ToolStripMenuItem).DropDownItems)
                    t.Enabled = (diabox.Diagram.figures.Count > 0 ? true : false);
            //меню "Выровнять"
            foreach (ToolStripItem t in ((menuStrip1.Items[3]
                as ToolStripMenuItem).DropDownItems[0]
                as ToolStripMenuItem).DropDownItems)
                t.Enabled = (diabox.SelectedFiguresCount > 1 ? true : false);
            //*** Проверка кнопок и меню "Правка" ***
            вырезатьToolStripMenuItem.Enabled =
                удалитьToolStripMenuItem.Enabled =
                копироватьToolStripMenuItem.Enabled =
                btnCut.Enabled = btnCopy.Enabled = (diabox.SelectedFiguresCount > 0 ? true : false);
            вставитьToolStripMenuItem.Enabled = 
                btnPaste.Enabled = diabox.CanPaste();

        }
        //*** ОБРАБОТКА СОБЫТИЯ ИЗМЕНЕНИЯ ДИАГРАММЫ ***
        void diabox_DiagramChanged(object sender, EventArgs e)
        {
            //добавляем * к имени, разблокируем Undo & Redo
            UpdateTitleAndButtons(false, true);
            //устанавливаем текущий инструмент
            SetActiveToolChecked();
        }
        public Form1()
        {
            int fig_ctr = 10;
            InitializeComponent();

            //очищаем вкладки
            tabDiagram.TabPages.Clear();
            //добавляем новый диаграм-бокс на новую вкладку
            AddNewDiagramBox();
            
            //жестко закрепляем размер верхней ячейки таблицы 1
            tableLayoutPanel1.RowStyles[0].Height = label1.Height + 4;
            tableLayoutPanel1.RowStyles[0].SizeType = SizeType.Absolute;
            
            //*** Настройка всплывающих подсказок и событий кнопок инструментов***
            ToolTip t = new ToolTip();
            //всплывающие подсказки для кнопок по порядку их расположения на панели
            string[] tips = new string[] {"Указатель", "Процедура", "Ресурс", "Рамка", "Синхронизация",
                "Распараллеливание", "Принятие решения", "Объединение потоков сущностей", "Текст",
                "Источник сущностей", "Сток сущностей", "Прямая линия", "Линия с изломом"};
            //цикл по всем контролам панели FlowLayoutPanel
            for (int i = 0; i < flpTools.Controls.Count; i++)
                if (flpTools.Controls[i] is CheckBox)
                {
                    t.SetToolTip(flpTools.Controls[i], tips[i]);
                    flpTools.Controls[i].Click += new EventHandler(chkToolClick);
                }
            Text = "Новая диаграмма 1 - "+APPLICATION_TITLE;
        }
        private void SetActiveToolChecked()
        {
            //сбрасываем все флажки
            foreach (Control c in flpTools.Controls)
                (c as CheckBox).Checked = false;
            //определяем имя текущего инструмента
            string current_tool = ActiveDiagramBox().Tool.ToString();
            //определяем совпадения с именами чек-боксов
            foreach(CheckBox c in flpTools.Controls)
                if (current_tool.Contains(c.Name.Substring(3, c.Name.Length - 3)))
                {
                    c.Checked = true;
                    break;
                }
        }
        private void chkToolClick(Object sender, EventArgs e)
        {
            //создаем список элементов перечисления в массиве
            if(tabDiagram.TabCount > 0)
            {
                Array tools = Enum.GetValues(typeof(DiagramBoxTools));
                //определяем имя нажатой кнопки
                string name = (sender as CheckBox).Name;
                //проверяем, содержит ли название текущего инструмента смысловую часть имени чек-бокса
                for (int i = 0; i < tools.Length; i++)
                {
                    string realName = name.Substring(3, name.Length - 3);
                    if (tools.GetValue(i).ToString().Equals(realName))
                    {
                        ActiveDiagramBox().Tool = (DiagramBoxTools) tools.GetValue(i);
                        break;
                    }
                }
                //отжимаем все остальные кнопки, кроме нужной
                SetActiveToolChecked();
            }
        }
        void SetBlockProperties(string name)
        {
            MessageBox.Show("Свойства недоступны!");
        }
        private void Form1_Load(Object sender, EventArgs e)
        {
            splitContainer1.Height = this.Height - SPLIT_MARGIN;
        }

        private void diagramBox1_Load(Object sender, EventArgs e)
        {

        }

        private void линияСИзлоToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().Tool = DiagramBoxTools.LedgeLineFigure;
        }

        private void линияToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().Tool = DiagramBoxTools.LineFigure;
        }

        private void объектАктивностьToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().Tool = DiagramBoxTools.ActivityBlock;
        }

        private void объектРесурсToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().Tool = DiagramBoxTools.ResourceBlock;
        }

        private void объектРешениеToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().Tool = DiagramBoxTools.DecisionBlock;
        }

        private void объектКоллекторToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().Tool = DiagramBoxTools.EntityCollectorBlock;
        }

        private void объектСинхронизацияToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().Tool = DiagramBoxTools.SynchroBlock;
        }

        private void объектПараллельностьToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().Tool = DiagramBoxTools.ParallelBlock;
        }

        private void объектСтокToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().Tool = DiagramBoxTools.SinkBlock;
        }

        private void объектИстокToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().Tool = DiagramBoxTools.SourceBlock;
        }

        private void объектРамкаToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().Tool = DiagramBoxTools.ColoredFrameBlock;
        }

        private void объектВнешнийРесурсToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().Tool = DiagramBoxTools.ExternalResourceBlock;
        }

        private void наПереднийПланToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().BringToFront();
        }

        private void наЗаднийПланToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().SendToBack();
        }

        private void выровнятьПоЛевомуКраюToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().AlignLeft();
        }

        private void стрелкаToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().Tool = DiagramBoxTools.Arrow;
        }

        private void выровнятьПоНизуToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().AlignBottom();
        }

        private void выровнятьПоВерхуToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().AlignTop();
        }

        private void выровнятьПоПравомуКраюToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().AlignRight();
        }

        private void выровнятьПоЦентруToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().AlignCenters();
        }

        private void выровнятьПоЦентруToolStripMenuItem1_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().AlignMiddles();
        }

        private void надписьToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            ActiveDiagramBox().Tool = DiagramBoxTools.Label;
        }

        private void экспортВBMPToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            FileDialog fd = new SaveFileDialog();
            fd.Filter = "Битовое изображение|*.bmp";
            if (fd.ShowDialog() == DialogResult.OK)
                ActiveDiagramBox().SaveAsBitmap(fd.FileName);
        }

        private void сохранитьКакToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            FileDialog fd = new SaveFileDialog();
            fd.Filter = "Файл диаграммы |*.dgm";
            if (fd.ShowDialog() == DialogResult.OK)
            {
                //запись диаграммы в файл
                FileStream fs = new FileStream(fd.FileName, FileMode.Create);
                ActiveDiagramBox().SaveDiagram(fs, fd.FileName);
                //сохраняем текущий экземпляр ядра
                ActiveSimulationKernel().Save(fs);
                fs.Close();
                UpdateTitleAndButtons(true, false);
                btnSave.Enabled = false;
                сохранитьToolStripMenuItem.Enabled = false;
            }
        }

        private void открытьToolStripMenuItem_Click(Object sender, EventArgs e)
        {
            FileDialog fd = new OpenFileDialog();
            fd.Filter = "Файл диаграммы |*.dgm";
            if (fd.ShowDialog() == DialogResult.OK)
            {
                try
                {
                    //добавление новой вкладки
                    AddNewDiagramBox(false);
                    DiagramBox diabox = ActiveDiagramBox();
                    //загрузка диаграммы на вкладку
                    FileStream fs = new FileStream(fd.FileName, FileMode.Open);
                    diabox.OpenDiagram(fs, fd.FileName);
                    diabox.Diagram.Name = RandomName8();
                    //загрузка ядра симуляции
                    SimKernel kernel = new SimKernel();
                    kernel.Open(fs);
                    fs.Close();
                    BindKernel(ref diabox, ref kernel);
                    simKernels.Add(kernel);
                    //обновление титула и кнопок
                    UpdateTitleAndButtons(true, false);
                }
                catch (Exception ex)
                {
                    //удаляем активную диаграмму
                    CloseActiveDiagram();
                    MessageBox.Show("Файл имеет неверный формат или поврежден!", APPLICATION_TITLE, MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

        private void Form1_Resize(object sender, EventArgs e)
        {
            splitContainer1.Height = this.Height - SPLIT_MARGIN;
        }

        private void удалитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().Delete();
        }

        private void копироватьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().Copy();
        }
        private void CloseActiveDiagram()
        {
            if (tabDiagram.SelectedTab.Text[0] == '*')
            {
                //спрашиваем: сохранить?
                DialogResult d = MessageBox.Show("Сохранить диаграмму?", APPLICATION_TITLE, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
                if (d == DialogResult.Yes)
                {
                    сохранитьToolStripMenuItem_Click(null, null);
                    if (ActiveDiagramBox().FileName == "")//нажали отмена по save as
                        return;
                }
                else if (d == DialogResult.Cancel)
                    return;
            }
            //удаляем текущее ядро симуляции
            simKernels.Remove(ActiveSimulationKernel());
            //удаляем текущую вкладку
            tabDiagram.TabPages.Remove(tabDiagram.SelectedTab);
            //блокируем все кнопки
            UpdateTitleAndButtons(true, false);
        }
        private void закрытьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //закрываем текущую диаграмму
            CloseActiveDiagram();
        }

        private void tabDiagram_MouseDown(object sender, MouseEventArgs e)
        {
            // отображаем контекстное меню
            if (e.Button == MouseButtons.Right)
                cmTabDiagram.Show(tabDiagram, e.Location);
        }

        private void btnNewDocument_Click(object sender, EventArgs e)
        {
            //создание новой диаграммы + выделение новой вкладки
            tabDiagram.SelectedIndex = AddNewDiagramBox();
        }

        private void tabDiagram_SelectedIndexChanged(object sender, EventArgs e)
        {
            //если переключились между вкладками -> устанавливаем новый текст формы
            if(tabDiagram.TabCount > 0)
                this.Text = tabDiagram.SelectedTab.Text + " - " + APPLICATION_TITLE;
        }

        private void btnCut_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().Cut();
        }

        private void btnCopy_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().Copy();
        }

        private void btnPaste_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().Paste();
        }

        private void btnUndo_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().Undo();
        }

        private void btnRedo_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().Redo();
        }

        private void btnAlignLeft_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().AlignLeft();
        }

        private void btnAlignCenter_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().AlignCenters();
        }

        private void btnAlignRight_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().AlignRight();
        }

        private void btnAlignTop_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().AlignTop();
        }

        private void btnAlignMiddle_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().AlignMiddles();
        }

        private void btnAlignBottom_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().AlignBottom();
        }

        private void btnForward_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().BringToFront();
        }

        private void btnBackward_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().SendToBack();
        }

        private void отменитьДействиеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().Undo();
        }

        private void вернутьДействиеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().Redo();
        }

        private void вырезатьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().Cut();
        }

        private void вставитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().Paste();
        }

        private void выделитьВсеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ActiveDiagramBox().SelectAll();
        }

        private void btnSave_Click(object sender, EventArgs e)
        {
            сохранитьToolStripMenuItem_Click(null, null);
        }

        private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DiagramBox diabox = ActiveDiagramBox();
            if (diabox.FileName == "")
                сохранитьКакToolStripMenuItem_Click(null, null);
            else
            {
                //запись диаграммы в файл
                FileStream fs = new FileStream(diabox.FileName, FileMode.Create);
                ActiveDiagramBox().SaveDiagram(fs, diabox.FileName);
                //сохраняем текущий экземпляр ядра
                ActiveSimulationKernel().Save(fs);
                fs.Close();
                //выставление соответствующего заголовка формы и вкладки
                bool UPDATE_BUTTONS = true;
                bool ADD_ASTERISK_TO_TITLE = false;
                UpdateTitleAndButtons(UPDATE_BUTTONS, ADD_ASTERISK_TO_TITLE);
            }
            btnSave.Enabled = false;
        }

        private void btnOpen_Click(object sender, EventArgs e)
        {
            открытьToolStripMenuItem_Click(null, null);
        }

        private void btnExport_Click(object sender, EventArgs e)
        {
            экспортВBMPToolStripMenuItem_Click(null, null);
        }

        private void новыйToolStripMenuItem_Click(object sender, EventArgs e)
        {
            btnNewDocument_Click(null, null);
        }

        private void btnRun_Click(object sender, EventArgs e)
        {
            //парсинг модели
            errors = DiagramToKernelParser.SetLinks(ActiveDiagramBox().Diagram, ref ActiveSimulationKernel().blockList);
            //симуляция
            if (errors.Count == 0)
            {
                ActiveSimulationKernel().ShowSimulationWindow();
            }
            else //отображаем список ошибок
            {
                ParserErrorsForm f = new ParserErrorsForm();
                for (int i = 1; i <= errors.Count; i++ )
                    f.lstErrors.Items.Add(i.ToString() + ". " + errors[i - 1].Description);
                f.lstErrors.SelectedIndexChanged += lstErrors_SelectedIndexChanged;
                f.lblErrors.Text = "Всего обнаружено ошибок: " + errors.Count.ToString();
                f.Show();
            }
        }
        //Обработчик события выделения листа
        void lstErrors_SelectedIndexChanged(object sender, EventArgs e)
        {
            ListBox list = sender as ListBox;
            string name = errors[list.SelectedIndex].SenderName;
            DiagramBox diabox = ActiveDiagramBox();
            diabox.DeselectAll();
            //если ошибка связана с объектом диаграммы, выделяем его
            if (name != "")
            {
                int k = diabox.Diagram.figures.FindIndex(fig => fig.Name == name);
                if(k > -1)//если в выделенном диаграм-боксе имеется указанная фигура
                {
                    diabox.SelectFigure(k);
                }
            }
        }

        private void runOptimizerToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //парсинг модели
            errors = DiagramToKernelParser.SetLinks(ActiveDiagramBox().Diagram, ref ActiveSimulationKernel().blockList);
            //оптимизирование
            if (errors.Count == 0)
            {
                ActiveSimulationKernel().ShowOptimizationWindow();
            }
            else //отображаем список ошибок
            {
                ParserErrorsForm f = new ParserErrorsForm();
                for (int i = 1; i <= errors.Count; i++)
                    f.lstErrors.Items.Add(i.ToString() + ". " + errors[i - 1].Description);
                f.lstErrors.SelectedIndexChanged += lstErrors_SelectedIndexChanged;
                f.lblErrors.Text = "Всего обнаружено ошибок: " + errors.Count.ToString();
                f.Show();
            }
        }

        private void запускМоделированияToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //парсинг модели
            errors = DiagramToKernelParser.SetLinks(ActiveDiagramBox().Diagram, ref ActiveSimulationKernel().blockList);
            //симуляция
            if (errors.Count == 0)
            {
                ActiveSimulationKernel().ShowSimulationWindow();
            }
            else //отображаем список ошибок
            {
                ParserErrorsForm f = new ParserErrorsForm();
                for (int i = 1; i <= errors.Count; i++)
                    f.lstErrors.Items.Add(i.ToString() + ". " + errors[i - 1].Description);
                f.lstErrors.SelectedIndexChanged += lstErrors_SelectedIndexChanged;
                f.lblErrors.Text = "Всего обнаружено ошибок: " + errors.Count.ToString();
                f.Show();
            }
        }

        private void настройкаПараметровРесурсовToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //покажем окно настроек параметров
            ActiveSimulationKernel().ShowSetParamsWindow();
        }

        private void бДToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form db = new MainDbForm();
            db.Show();
        }
    }
}